package cn.hinglo.gameclaw.admin.service;

import cn.hinglo.gameclaw.admin.dao.AdminIndexDao;
import cn.hinglo.gameclaw.admin.entity.UserAddData;
import cn.hinglo.gameclaw.admin.entity.UserData;
import cn.hinglo.gameclaw.data.entity.Result;
import cn.hinglo.gameclaw.data.utils.ResultUtils;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

import static cn.hinglo.gameclaw.data.utils.FieldUtils.USER_QQ;
import static cn.hinglo.gameclaw.data.utils.FieldUtils.USER_WEIXIN;

/**
 * @createTime: 2018/1/26
 * @author: HingLo
 * @description: 首页管理的服务层
 */
@Service
@Slf4j
public class AdminIndexService {
    private final AdminIndexDao adminIndexDao;

    @Autowired
    public AdminIndexService(AdminIndexDao adminIndexDao) {
        this.adminIndexDao = adminIndexDao;
    }

    /**
     * 用户比例图
     *
     * @return 用户比例数据图
     */
    public UserData userProportionService() {
        return adminIndexDao.userProportionDao();
    }

    /**
     * 过去N天的用户数目
     *
     * @param num  天数
     * @param type 账号类型
     * @return 结果
     */
    public Result userAddDataService(Integer num, Integer type) {
        if (type == null || num == null) {
            return ResultUtils.error("请求参数不正确");
        }
        int day = 7;
        if (num < day) {
            return ResultUtils.error("不能查看小于过去7天的信息");
        }
        if (type != USER_QQ && type != USER_WEIXIN) {
            return ResultUtils.error("统计的参数类型不正确");
        }
        //数据库中查询出来的结果集
        List<UserAddData> list = adminIndexDao.userAddDataDao(num, type);
        //将断天的数据补充完整
        Date date = new Date();
        //判断是否全部为null
        if (list.isEmpty()) {
            for (Integer i = 0; i < num; i++) {
                Date date1 = DateUtil.offsetDay(date, 0 - i - 1);
                UserAddData userAddData = getUserAddData(date1);
                list.add(i, userAddData);
            }
        } else {
            for (Integer i = 0; i < num; i++) {
                Date date1 = DateUtil.offsetDay(date, 0 - i - 1);
                if (list.size() <= i || !checkDate(list.get(i).getDate(), date1)) {
                    UserAddData userAddData = getUserAddData(date1);
                    list.add(i, userAddData);
                }
            }
        }
        //升序排序
        list.sort((o1, o2) -> {
            if (o1.getDate().getTime() - o2.getDate().getTime() > 0) {
                return 1;
            } else {
                return -1;
            }
        });

        return ResultUtils.success(list);
    }

    /**
     * 判断两个时间是否是相同的天
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return 时间是否是同一天
     */
    private boolean checkDate(Date date1, Date date2) {
        String sdate1 = DateUtil.format(date1, "yyyy-MM-dd");
        String sdate2 = DateUtil.format(date2, "yyyy-MM-dd");
        return sdate1.equals(sdate2);
    }

    /**
     * 根据指定的时间创建一个UserAddData 对象
     *
     * @param date 时间对象
     * @return userAddData对象
     */
    private UserAddData getUserAddData(Date date) {
        UserAddData userAddData = new UserAddData();
        userAddData.setDate(date);
        userAddData.setNum(0);
        return userAddData;
    }

}
